use ratatui::{buffer::Buffer, layout::{self, Alignment, Constraint, Direction, Rect}, style::{Color, Modifier, Style}, widgets::{Block, BorderType, Borders, List, ListItem, Padding, Widget}};


// buffer 用于存储和操作界面的绘制数据
// layout用于处理界面布局  包括布局方向 约束条件  对齐方式  矩形区域
// style 设置界面元素的样式 比如颜色 修饰符等等
// widget 提供各种界面组件  比如块 列表 列表项

use super::Clear;
use crate::{core::tasks::TASKS_PERCENT, ui::Ctx};

pub struct Layout<'a> {
    cx: &'a Ctx,
}

impl<'a> Layout<'a> {
    pub fn new(cx: &'a Ctx) -> Self { Self { cx } }

    pub fn area(area: Rect) -> Rect {
        let chunk = layout::Layout::default()
            .direction(Direction::Vertical)
            .constraints(
                [
                    Constraint::Percentage((100 - TASKS_PERCENT) / 2),
                    Constraint::Percentage(TASKS_PERCENT),
                    Constraint::Percentage((100 - TASKS_PERCENT) / 2),
                ]
                    .as_ref(),
            )
            .split(area)[1];

        let chunk = layout::Layout::default()
            .direction(Direction::Horizontal)
            .constraints(
                [
                    Constraint::Percentage((100 - TASKS_PERCENT) / 2),
                    Constraint::Percentage(TASKS_PERCENT),
                    Constraint::Percentage((100 - TASKS_PERCENT) / 2),
                ]
                    .as_ref(),
            )
            .split(chunk)[1];

        chunk
    }
}

impl<'a> Widget for Layout<'a> {
    fn render(self, area: Rect, buf: &mut Buffer) {
        let area = Self::area(area); // 计算布局区域

        Clear.render(area, buf); // 清除该区域
        let block = Block::default()  // 创建block组件 标题是tasks
            .title("Tasks")
            .title_alignment(Alignment::Center)
            .padding(Padding::new(0, 0, 1, 1)) // 内边距
            .borders(Borders::ALL)
            .border_type(BorderType::Rounded)  // 圆角
            .border_style(Style::default().fg(Color::Rgb(128, 174, 250)));  // 边框颜色
        block.clone().render(area, buf);

        let tasks = &self.cx.tasks;  // 从上下文获取任务列表
        let items = tasks
            .paginate()  // 返回经过分页的集合  
            .iter()//返回经过分页后的任务集合  
            .enumerate()  // 为迭代器每个元素添加一个索引
            .map(|(i, v)| {  // 对于迭代器中的每个元素进行转化  接受闭包作为参数 闭包参数是i,v
                let mut item = ListItem::new(v.name.clone());
                if i == tasks.cursor {
                    item = item.style(Style::default().add_modifier(Modifier::UNDERLINED));
                }
                item
            }) // 每个task转成list iterm
            .collect::<Vec<_>>();

        List::new(items).render(block.inner(area), buf);
    }
}
